var lex=require("./lex");


exports.first = function(target_text){
    var Vt=[];
    var Vt_map={};
    var Vt_class_map={};
    var clone_map=[];
    //map
    for(var i=0;i<target_text.length;i++){
        // console.log(i);
        // console.log(target_text[i]);
        var temp=lex.lexFirst(target_text[i]);
        // console.log(temp);
        var temp_map=new Array(temp.length/2+1);
        for(var j=0;j<temp.length;j+=2){
            temp_map[j/2]=new Array(2);
            temp_map[j/2][0]=temp[j];
            temp_map[j/2][1]=temp[j+1];
            if(i==0){
                clone_map[j/2]=new Array(2);
                clone_map[j/2][0]=temp[j];
                clone_map[j/2][1]=temp[j+1];
            }
        }
        var f=false;
        var index=0;
        Vt.map(function(value,j){
            if(value==temp_map[0][1]){
                f=true;
                index=j;
            }
        });
        if(!f){
            index=Vt.length;
            Vt[Vt.length]=temp_map[0][1];
        }
        if(Vt_map[Vt[index]]){
        }else{
            Vt_map[Vt[index]]=[];
            Vt_class_map[Vt[index]]=[];
        }
        Vt_map[Vt[index]][Vt_map[Vt[index]].length]=temp_map[2][1];
        Vt_class_map[Vt[index]][Vt_class_map[Vt[index]].length]=temp_map[2][0];
        for(var j=2;j<temp_map.length-1;j++){
            // console.log(temp_map[j][0]);
            if(temp_map[j]&&temp_map[j][0]==44){
                Vt_map[Vt[index]][Vt_map[Vt[index]].length]=temp_map[j+1][1];
                // console.log(Vt_map[Vt[index]]);
                Vt_class_map[Vt[index]][Vt_class_map[Vt[index]].length]=temp_map[j+1][0];
                // console.log(Vt_class_map[Vt[index]]);
            }
        }
    }




    //collect
    var First={};
    for(var i=Vt.length-1;i>=0;i--){
        First[Vt[i]]=[];
        for(var value in Vt_class_map[Vt[i]]){
            if (Vt_class_map[Vt[i]][value]==43||Vt_class_map[Vt[i]][value]==33||(Vt_class_map[Vt[i]][value]>=36&&Vt_class_map[Vt[i]][value]<=39)){
                First[Vt[i]][First[Vt[i]].length]=Vt_map[Vt[i]][value];
            }else if(Vt_class_map[Vt[i]][value]==34){
                // console.log("检测出空串,当前i="+i);
                var f=false;
                // if(i==0){
                //     console.log("");
                //     for(var k=3;k<=clone_map.length;k++){
                //         if(Vt.indexOf(clone_map[k][1])!=-1){
                //             for(var j=0;j<Vt_map[clone_map[j][1]].length;j++) {
                //                 Vt_map[Vt[i]][Vt_map[Vt[i]].length] = Vt_map[clone_map[j][1]][j];
                //                 First[Vt[i]][First[Vt[i]].length] = Vt_map[clone_map[j][1]][j];
                //             }
                //             f=true;
                //             break;
                //         }else if(clone_map[k][0]==43||temp_map[k][0]==33||(clone_map[k][0]>=36&&clone_map[k][0]<=39)){
                //             First[Vt[i]][First[Vt[i]].length]=Vt_map[clone_map[j][1]][k];
                //             f=true;
                //             break;
                //         }
                //     }
                // }
                if(!f){
                    First[Vt[i]][First[Vt[i]].length]=Vt_map[Vt[i]][value];
                }
            }else{
                for (var j = 0; j < Vt_map[Vt_map[Vt[i]][value]].length; j++) {
                    var f = false;
                    if (Vt_class_map[Vt_map[Vt[i]][value]][j] == 34) {
                        console.log("检测出空串,当前i=" + i);
                        if (i == 0&&clone_map.length>=4) {
                            // console.log(clone_map);

                            for (var k = 3; k < clone_map.length; k++) {
                                console.log("k:" + k + "  temp_map["+k+"][1]=" + clone_map[k][1]);
                                if (Vt.indexOf(clone_map[k][1]) != -1) {
                                    console.log("该值为非终结符");
                                    // console.log(Vt_map[clone_map[k][1]]);
                                    for (var g = 0; g < Vt_map[clone_map[k][1]].length; g++) {
                                        // console.log(Vt_map[Vt[i]]);

                                        Vt_map[Vt[i]][Vt_map[Vt[i]].length] = Vt_map[clone_map[k][1]][g];
                                        First[Vt[i]][First[Vt[i]].length] = Vt_map[clone_map[k][1]][g];
                                    }
                                    // console.log(First[Vt[i]]);
                                    f = true;
                                    break;
                                } else if (clone_map[k][0] == 43 || clone_map[k][0] == 33 || (clone_map[k][0] >= 36 && clone_map[k][0] <= 39)) {
                                    console.log("该值为终结符");
                                    First[Vt[i]][First[Vt[i]].length] = clone_map[k][1];
                                    console.log(First[Vt[i]]);
                                    f = true;
                                    break;
                                }
                            }
                        }
                    }
                    if(!f){
                        Vt_map[Vt[i]][Vt_map[Vt[i]].length] = Vt_map[Vt_map[Vt[i]][value]][j];
                        First[Vt[i]][First[Vt[i]].length] = Vt_map[Vt_map[Vt[i]][value]][j];
                    }


                }
            }
        }
    }
    console.log("CollectFirst集合：");
    console.log(First);
    //reduce
    for(var i in First){
        for(var j =0;j<First[i].length;j++){
            if(Vt.indexOf(First[i][j])==-1){
                for(var k=j+1;k<First[i].length;k++) {
                    if (First[i][k] == First[i][j]) {
                        First[i][k] = "";
                    }
                }
            }else{
                delete (First[i][j]);
            }

        }

    }
    console.log("RedcueFirst集合：");
    console.log(First);
    return First;
};